#!/bin/bash
#
# 飞牛OS系统盘垃圾清理脚本（基于Debian）
# 保留原有清理项目，增加用户确认功能
#

echo "================================================"
echo "           飞牛OS系统盘垃圾清理脚本"
echo "================================================"

# 显示清理项目列表
echo -e "\n本次将执行以下清理项目："
echo "================================================"
echo "1. 包管理器缓存清理"
echo "   - apt clean, autoclean, autoremove"
echo ""
echo "2. 系统日志清理"
echo "   - 删除 syslog.*, dpkg.log.*, btmp.* 归档文件"
echo "   - 截断 syslog, btmp 当前日志"
echo "   - 清理 trim_app_center 日志 (info.log, error.log)"
echo "   - 清理 accountsrv/info.log"
echo "   - 删除 samba/*.gz, samba/*.old 归档"
echo ""
echo "3. 系统journal日志清理"
echo "   - 清理7天前的journal日志"
echo ""
echo "4. 临时文件清理"
echo "   - 清理 /tmp (1天前), /var/tmp (7天前) 临时文件"
echo "   - 清理 /var/cache/apt/archives/*.deb"
echo ""
echo "5. 扩展日志清理"
echo "   - 清理7天前的 *.log.*, *.gz, *.old, *.1 文件"
echo ""
echo "6. 崩溃报告清理"
echo "   - 清理 /var/crash/*"
echo ""
echo "7. 用户缓存清理"
echo "   - 清理用户缩略图缓存 (~/.cache/thumbnails)"
echo "================================================"

# 用户确认循环
while true; do
    read -p "是否继续执行清理？(y/n): " choice
    case "$choice" in
        y|Y|yes|YES)
            echo "开始执行清理..."
            break
            ;;
        n|N|no|NO)
            echo "已取消清理操作"
            exit 0
            ;;
        *)
            echo "无效输入，请输入 y 或 n"
            ;;
    esac
done

echo -e "\n开始清理操作..."
echo "开始时间: $(date)"

# 检查是否以root权限运行
if [ "$EUID" -ne 0 ]; then
    echo "请使用sudo运行此脚本或切换到root用户"
    echo "用法: sudo $0"
    exit 1
fi

# 记录开始时间
START_TIME=$(date +%s)

# 显示清理前磁盘使用情况
echo -e "\n=== 清理前磁盘使用情况 ==="
BEFORE_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
BEFORE_AVAILABLE=$(df -h / | awk 'NR==2 {print $4}')
BEFORE_USED=$(df -h / | awk 'NR==2 {print $3}')
echo "根分区使用率: ${BEFORE_USAGE}%"
echo "已用空间: ${BEFORE_USED}"
echo "可用空间: ${BEFORE_AVAILABLE}"

# 获取特定目录清理前大小
echo -e "\n=== 主要目录清理前大小 ==="
get_dir_size() {
    local dir=$1
    if [ -d "$dir" ]; then
        du -sh "$dir" 2>/dev/null | awk '{print "  " $2 ": " $1}'
    fi
}

echo "日志目录大小:"
get_dir_size "/var/log"
echo "缓存目录大小:"
get_dir_size "/var/cache"
get_dir_size "/tmp"

# 函数：安全截断日志文件
safe_truncate_log() {
    local log_file=$1
    if [ -f "$log_file" ] && [ -s "$log_file" ]; then
        # 对于大日志文件，先备份再清空（可选）
        if [ "$(stat -c%s "$log_file" 2>/dev/null || echo 0)" -gt 10485760 ]; then
            echo "备份大日志文件: $log_file"
            cp "$log_file" "${log_file}.backup.$(date +%Y%m%d)" 2>/dev/null
        fi
        truncate -s 0 "$log_file"
        echo "✓ 已截断: $log_file"
    elif [ ! -f "$log_file" ]; then
        echo "⚠ 文件不存在: $log_file"
    fi
}

# 1. 清理apt缓存（原有项目）
echo -e "\n=== 1. 清理包管理器缓存 ==="
apt clean
echo "✓ apt clean 完成"

# 增加：自动清理和移除不需要的包
apt autoclean
apt autoremove -y
echo "✓ apt autoclean 和 autoremove 完成"

# 2. 清理系统日志（原有项目基础上增强）
echo -e "\n=== 2. 清理系统日志文件 ==="
cd /var/log

# 原有日志清理项目
echo "清理系统日志归档..."
rm -rf syslog.* 2>/dev/null
safe_truncate_log "syslog"

rm -rf dpkg.log.* 2>/dev/null
rm -f btmp.* 2>/dev/null
safe_truncate_log "btmp"

# 检查并清理应用日志
echo "清理应用日志..."
if [ -d "trim_app_center" ]; then
    safe_truncate_log "trim_app_center/info.log"
    safe_truncate_log "trim_app_center/error.log"
else
    echo "⚠ trim_app_center 目录不存在"
fi

if [ -f "accountsrv/info.log" ]; then
    safe_truncate_log "accountsrv/info.log"
else
    echo "⚠ accountsrv/info.log 文件不存在"
fi

# 清理samba日志（原有项目）
echo "清理Samba日志..."
rm -rf samba/*.gz 2>/dev/null
rm -rf samba/*.old 2>/dev/null
echo "✓ samba日志归档文件已清理"

# 3. 新增：Debian系统journal日志清理
echo -e "\n=== 3. 清理系统journal日志 ==="
if command -v journalctl >/dev/null 2>&1; then
    JOURNAL_SIZE_BEFORE=$(journalctl --disk-usage 2>/dev/null | awk '{print $7$8}' || echo "0")
    echo "清理前Journal日志大小: $JOURNAL_SIZE_BEFORE"
    journalctl --vacuum-time=7d 2>/dev/null
    JOURNAL_SIZE_AFTER=$(journalctl --disk-usage 2>/dev/null | awk '{print $7$8}' || echo "0")
    echo "清理后Journal日志大小: $JOURNAL_SIZE_AFTER"
    echo "✓ 已清理7天前的journal日志"
else
    echo "ℹ journalctl 不可用，跳过journal日志清理"
fi

# 4. 新增：Debian系统临时文件清理
echo -e "\n=== 4. 清理临时文件和缓存 ==="

# 清理临时目录（保留最近1天的文件）
TMP_CLEANED=$(find /tmp -type f -atime +1 -delete -print 2>/dev/null | wc -l)
VAR_TMP_CLEANED=$(find /var/tmp -type f -atime +7 -delete -print 2>/dev/null | wc -l)
echo "✓ 已清理临时文件: /tmp(${TMP_CLEANED}个), /var/tmp(${VAR_TMP_CLEANED}个)"

# 清理apt缓存文件
APT_CLEANED_COUNT=$(ls /var/cache/apt/archives/*.deb 2>/dev/null | wc -l)
rm -rf /var/cache/apt/archives/*.deb 2>/dev/null
echo "✓ 已清理apt缓存文件: ${APT_CLEANED_COUNT}个 .deb 包"

# 5. 新增：清理旧的日志文件（扩展原有日志清理）
echo -e "\n=== 5. 扩展日志清理 ==="

# 清理所有旧的日志归档（保留最近7天）
OLD_LOGS_CLEANED=$(find /var/log -name "*.log.*" -type f -mtime +7 -delete -print 2>/dev/null | wc -l)
GZ_LOGS_CLEANED=$(find /var/log -name "*.gz" -type f -mtime +7 -delete -print 2>/dev/null | wc -l)
OLD_FILES_CLEANED=$(find /var/log -name "*.old" -type f -mtime +7 -delete -print 2>/dev/null | wc -l)

echo "✓ 已清理7天前的日志归档文件:"
echo "  - 日志归档: ${OLD_LOGS_CLEANED}个"
echo "  - 压缩日志: ${GZ_LOGS_CLEANED}个" 
echo "  - 旧文件: ${OLD_FILES_CLEANED}个"

# 6. 新增：清理崩溃报告
echo -e "\n=== 6. 清理系统崩溃报告 ==="
if [ -d "/var/crash" ]; then
    CRASH_FILES=$(ls /var/crash/ 2>/dev/null | wc -l)
    rm -f /var/crash/* 2>/dev/null
    echo "✓ 已清理崩溃报告: ${CRASH_FILES}个"
else
    echo "ℹ 无崩溃报告目录"
fi

# 7. 新增：清理缩略图缓存（如果有桌面环境）
echo -e "\n=== 7. 清理用户缓存 ==="
THUMBNAIL_CLEANED=0
for user_dir in /home/*; do
    if [ -d "$user_dir" ]; then
        user=$(basename "$user_dir")
        # 清理缩略图缓存
        if [ -d "$user_dir/.cache/thumbnails" ]; then
            THUMB_COUNT=$(find "$user_dir/.cache/thumbnails" -type f 2>/dev/null | wc -l)
            rm -rf "$user_dir/.cache/thumbnails"/* 2>/dev/null
            THUMBNAIL_CLEANED=$((THUMBNAIL_CLEANED + THUMB_COUNT))
        fi
    fi
done
echo "✓ 已清理缩略图缓存: ${THUMBNAIL_CLEANED}个文件"

# 强制同步文件系统，确保空间统计准确
sync

# 显示清理结果
echo -e "\n=== 清理完成 ==="

# 获取清理后磁盘使用情况
AFTER_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
AFTER_AVAILABLE=$(df -h / | awk 'NR==2 {print $4}')
AFTER_USED=$(df -h / | awk 'NR==2 {print $3}')

echo "清理后磁盘使用情况:"
echo "根分区使用率: ${AFTER_USAGE}%"
echo "已用空间: ${AFTER_USED}"
echo "可用空间: ${AFTER_AVAILABLE}"

# 计算释放的空间（估算）
echo -e "\n=== 释放空间估算 ==="
if [ "$BEFORE_USAGE" -gt "$AFTER_USAGE" ]; then
    USAGE_DIFF=$((BEFORE_USAGE - AFTER_USAGE))
    echo "✓ 根分区使用率下降: ${USAGE_DIFF}%"
else
    echo "⚠ 使用率变化不明显，可能因为系统正在运行中写入新数据"
fi

# 显示主要目录清理后大小对比
echo -e "\n=== 主要目录清理后大小 ==="
echo "日志目录大小:"
get_dir_size "/var/log"
echo "缓存目录大小:"
get_dir_size "/var/cache"
get_dir_size "/tmp"

# 计算清理耗时
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
echo -e "\n总耗时: ${DURATION}秒"
echo "清理完成时间: $(date)"

# 最终统计
TOTAL_CLEANED=$((OLD_LOGS_CLEANED + GZ_LOGS_CLEANED + OLD_FILES_CLEANED + TMP_CLEANED + VAR_TMP_CLEANED + APT_CLEANED_COUNT + THUMBNAIL_CLEANED + CRASH_FILES))
echo -e "\n=== 清理统计 ==="
echo "总计清理文件数量: ${TOTAL_CLEANED} 个"

echo -e "\n建议重启系统以使所有更改生效，特别是如果清理了被进程占用的日志文件。"